package com.terran4j.kotlin.basic


//  与 java 的 IsNullable 类对比，看下 Kotlin 中的 null 处理有多简单。

val data: Map<String, Map<String, Any>>? = null

fun aboutNullable(key1: String, key2: String): Any? {
    // 使用 ? 来判空，当中途遇到为 null 时，整个表达式即为 null 。
    return data?.get(key1)?.get(key2)
}



fun aboutNullable() {
    var m: Int = 3;
//    m = null;     // 编译错误，m 不可为 null.
    println(m.toByte())   // 不可为 null ，可放心使用。

    var n: Int? = 3
    n = null       // 编译正确，n 可为 null.
//    println(n.toByte()) // 编译错误，因为 m 可能为 null
    println(n?.toByte())  // 编译正确，因为作了判空检查。
}

// Elvis 操作符
fun aboutElvis() {
    var str: String? = "abc"
    var size = str?.length ?: 0

    // 上面这句等价于：
    if (str != null) {
        size = str.length
    } else {
        size = 0
    }
}

// 为 null 时抛出 NullPointerException.
fun aboutNPE() {
    var str: String? = "abc"
    println(str!!.length)
}
